package com.gopay.bis.service.bank.impl.ebank;

import com.gopay.bis.common.util.BankLogUtils;
import com.gopay.bis.common.util.BisPayCheckUtils;
import com.gopay.bis.common.util.constants.BisPayConstants;
import com.gopay.bis.manager.bank.ebank.SpdbB2bManager;
import com.gopay.common.Result;
import com.gopay.common.constants.bank.SpdbConstants;
import com.gopay.common.constants.proccode.ProcCodeConstants;
import com.gopay.common.domain.bank.BaseMessage;
import com.gopay.common.domain.bank.spdb.ebank.SpdbMessage;
import com.gopay.common.exception.GopayException;
import com.gopay.remote.bank.BankInteractRemoteService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

/**
 * @SpdbB2bBankServiceImpl.java
 * @author wanggang
 * @2013-12-12 下午1:51:15 www.gopay.com.cn Inc.All rights reserved.
 */
public class SpdbB2bBankServiceImpl implements BankInteractRemoteService {

	@Resource(name = "spdbB2bManager")
	private SpdbB2bManager spdbB2bManager;

	@Override
	public Result pay(BaseMessage base) {
		Result result = new Result(false);
		try {
			SpdbMessage messageB2B = new SpdbMessage();			
			BeanUtils.copyProperties(base, messageB2B);
			messageB2B = (SpdbMessage) spdbB2bManager.sign(messageB2B);
			result.setDefaultModel(messageB2B);
			result.setSuccess(true);
		} catch (GopayException e) {
			BankLogUtils.printServiceImplExceptionLog(e);
			result.setResultCode(e.getErrCode());
		} catch (Exception ex) {
			BankLogUtils.printServiceImplExceptionLog(ex);
			result.setResultCode(ProcCodeConstants.PROC_CODE_100E6028);
		}
		return result;
	}

	@Override
	public Result bankBack(BaseMessage base) {
		Result result = new Result(false);
		try {
			SpdbMessage messageB2B = new SpdbMessage();
			BeanUtils.copyProperties(base, messageB2B);
			boolean flag = (Boolean) spdbB2bManager.verify(messageB2B);
			result.setModel("message", messageB2B);
			result.setDefaultModel(flag);
			result.setSuccess(true);
			if ((Boolean) result.getDefaultModel()) {
				Map<String, String> param = new HashMap<String, String>();
				if (SpdbConstants.RESPCODE_SUCCESS.equals(messageB2B.getRespCode())) {
					// 银行返回成功状态
					param.put("orderId", messageB2B.getOrderId());
					param.put("amt", messageB2B.getAmount().toString());
					param.put("cardType", "Unknown");
					param.put("notifyNum", "1");
					param.put("payStatus", "00");
					param.put("retCode", "00");
					param.put("retMsg", "验签成功");
					param.put("signData", "");
                    param.put("isFront", String.valueOf(base.isFront()));
					result.setModel("isNotifyCashier", param);
					result.setOrderStatus(true);
				} else {
					// 通知后台地址该订单失败
					param.put("orderId", messageB2B.getOrderId());
					param.put("amt", messageB2B.getAmount().toString());
					param.put("cardType", "Unknown");
					param.put("notifyNum", "1");
					param.put("payStatus", "01");
					param.put("retCode", "01");
					param.put("retMsg", "验签失败");
					param.put("signData", "");
                    param.put("isFront", String.valueOf(base.isFront()));
					result.setModel("isNotifyCashier", param);
					result.setOrderStatus(false);}
			}
		} catch (GopayException e) {
			BankLogUtils.printServiceImplExceptionLog(e);
			result.setResultCode(e.getErrCode());
		} catch (Exception e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(ProcCodeConstants.PROC_CODE_100E6064);
        }
		return result;
	}

	@Override
	public Result query(BaseMessage base) {
		Result result = new Result(false);
		try {
			SpdbMessage messageB2B = new SpdbMessage();
			BeanUtils.copyProperties(base, messageB2B);
			SpdbMessage b2b = (SpdbMessage) spdbB2bManager.query(messageB2B);
			result.setDefaultModel(b2b);
			result.setSuccess(true);
			if(BisPayCheckUtils.checkExternalOrderID(messageB2B.getOrderId())){
				Map<String, String> param = new HashMap<String, String>();
				param.put("orderId", messageB2B.getOrderId());
				param.put("amount", messageB2B.getAmount().toString());
				if (b2b == null) {
					// 查询订单为空
					param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
					param.put("returnMessage", "银行返回对账结果为空");
					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					result.setModel("queryResult", param);
					return result;
				}

				if (StringUtils.isNotBlank(b2b.getErrorCode()) || StringUtils.isNotBlank(b2b.getErrorMsg())) {
				    if(SpdbConstants.QUERY_NO_DATA.equalsIgnoreCase(b2b.getErrorCode())){
				        param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
                        param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
                        param.put("returnMessage", "处理中");  
	                }else{
	                 // 查询订单错误
	                    param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
	                    param.put("returnMessage", b2b.getErrorMsg());
	                    param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
	                }				    
				}
				// 如果查询成功，则一定有定单信息
				else {
					// 成功处理
					if (SpdbConstants.RESPCODE_SUCCESS.equalsIgnoreCase(b2b.getRespCode())) {// 如果成功
						param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
						param.put("tradeState", BisPayConstants.TRADESTATE_SUCCESS);
						param.put("returnMessage", "交易成功");
					}
					//处理中
					else if(SpdbConstants.QUERY_PROCESSED.equalsIgnoreCase(b2b.getRespCode())){//交易处理中 
					    param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
                        param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
                        param.put("returnMessage", "处理中");					    
					}
					//失败处理
					else if (!(SpdbConstants.RESPCODE_SUCCESS.equalsIgnoreCase(b2b.getRespCode()))) {// 如果失败
						param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
						param.put("tradeState", BisPayConstants.TRADESTATE_FAIL);
						param.put("returnMessage", b2b.getErrorMsg());
					}
				}
				result.setModel("queryResult", param);
			}
		} catch (GopayException e) {
			BankLogUtils.printServiceImplExceptionLog(e);
			result.setResultCode(e.getErrCode());
		} catch (Exception ex) {
			BankLogUtils.printServiceImplExceptionLog(ex);
			result.setResultCode(ProcCodeConstants.PROC_CODE_100E6032);
		}
		return result;
	}

	@Override
	public Result refund(BaseMessage base) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Result dayend(BaseMessage base) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Result queryBack(BaseMessage base) {
		// TODO Auto-generated method stub
		return null;
	}

    @Override
    public Result refundBack(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Result refundQuery(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

	@Override
	public Result sendBankRefund(BaseMessage base) {
		// TODO Auto-generated method stub
		return null;
	}
}
